/**************************************************************************** 
 * Meta，一个轻量级的静态分区Hypervisor 
 *
 * 版权(c) , 2022-
 *
 * 作者:
 *      Tupelo Shen <shenwanjiang2013@163.com>
 *
 * Meta是一个自由软件，你可以在遵循GNU GPLv2协议的条件下，重新修改并发布它。
 *
 ***************************************************************************/

#ifndef __IOMMU_H__
#define __IOMMU_H__

#include <meta.h>
#include <arch/iommu.h>
#include <objcache.h>
#include <list.h>

struct vm_config;
struct vm;

struct iommu_vm {
    struct list             dev_list;
    struct objcache         dev_oc;
    struct iommu_vm_arch    arch;
};

/****************************************************************************
 ****                           公共函数接口                             ****
 ****************************************************************************/
void iommu_init();

/* 虚拟机使用的IOMMU接口 */
bool iommu_vm_init(struct vm *vm, const struct vm_config *config);
bool iommu_vm_add_device(struct vm *vm, streamid_t dev_id);

/* 与架构相关的实现（实现位于`arch`目录） */
bool iommu_arch_init(void);
bool iommu_arch_vm_init(struct vm *vm, const struct vm_config *config);
bool iommu_arch_vm_add_device(struct vm *vm, streamid_t id);

#endif